/*
* Licensed to Elasticsearch under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch licenses this file to you under
* the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.elasticsearch.action.preparespec;
import org.elasticsearch.cluster.metadata.MappingMetaData;
import org.elasticsearch.common.ParseFieldMatcher;
import org.elasticsearch.common.collect.Tuple;
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.ParseFieldRegistry;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.indices.query.IndicesQueriesRegistry;
import org.elasticsearch.plugin.TokenPlugin;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.search.SearchExtRegistry;
import org.elasticsearch.search.aggregations.AggregationBuilder;
import org.elasticsearch.search.aggregations.Aggregator;
import org.elasticsearch.search.aggregations.AggregatorParsers;
import org.elasticsearch.search.aggregations.bucket.significant.SignificantTermsAggregationBuilder;
import org.elasticsearch.search.aggregations.bucket.significant.SignificantTermsParser;
import org.elasticsearch.search.aggregations.bucket.significant.heuristics.SignificanceHeuristicParser;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.bucket.terms.TermsParser;
import org.elasticsearch.search.suggest.Suggesters;
import org.elasticsearch.test.ESIntegTestCase;
import org.elasticsearch.test.ESTestCase;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
import static org.hamcrest.Matchers.equalTo;
public class PrepareSpecTests extends ESTestCase {
private IndicesQueriesRegistry queryRegistry = new IndicesQueriesRegistry();
private SearchExtRegistry searchExtRegistry = new SearchExtRegistry();
private ParseFieldRegistry<Aggregator.Parser> aggregationParserRegistry = new ParseFieldRegistry<>("aggregation");
private AggregatorParsers aggParsers = new AggregatorParsers(aggregationParserRegistry,
new ParseFieldRegistry<>("pipline_aggregation"));
private Suggesters suggesters = new Suggesters(Collections.emptyMap());
private ParseFieldMatcher parseFieldMatcher = new ParseFieldMatcher(Settings.EMPTY);
private ParseFieldRegistry<SignificanceHeuristicParser> significanceHeuristicParserRegistry = new ParseFieldRegistry<>(
"significance_heuristic");
@Override
public void setUp() throws Exception {
super.setUp();
aggregationParserRegistry.register(new TermsParser(), TermsAggregationBuilder.NAME);
aggregationParserRegistry.register(new SignificantTermsParser(significanceHeuristicParserRegistry, queryRegistry),
SignificantTermsAggregationBuilder.NAME);
}
public void testParseFieldSpecRequestsWithSignificantTemrs() throws IOException {
XContentBuilder source = getTextFieldRequestSourceWithSignificnatTerms();
Tuple<Boolean,List<FieldSpecRequest>> fieldSpecRequests = TransportPrepareSpecAction.parseFieldSpecRequests(
queryRegistry, aggParsers, suggesters, searchExtRegistry, parseFieldMatcher, source.string());
assertThat(fieldSpecRequests.v2().size(), equalTo(1));
}
public void testParseFieldSpecRequestsWithAllTerms() throws IOException {
XContentBuilder source = getTextFieldRequestSourceWithAllTerms();
Tuple<Boolean,List<FieldSpecRequest>> fieldSpecRequests = TransportPrepareSpecAction.parseFieldSpecRequests(
queryRegistry, aggParsers, suggesters, searchExtRegistry, parseFieldMatcher, source.string());
assertThat(fieldSpecRequests.v2().size(), equalTo(1));
}
public void testParseFieldSpecRequestsWithGivenTerms() throws IOException {
XContentBuilder source = getTextFieldRequestSourceWithGivenTerms();
Tuple<Boolean,List<FieldSpecRequest>> fieldSpecRequests = TransportPrepareSpecAction.parseFieldSpecRequests(
queryRegistry, aggParsers, suggesters, searchExtRegistry, parseFieldMatcher, source.string());
assertThat(fieldSpecRequests.v2().size(), equalTo(1));
}
private MappingMetaData getMappingMetaData() throws IOException {
XContentBuilder mapping = jsonBuilder();
mapping.startObject();
mapping.startObject("type");
mapping.startObject("properties");
mapping.startObject("text");
mapping.field("type", "string");
mapping.endObject();
mapping.endObject();
mapping.endObject();
mapping.endObject();
XContentParser parser = XContentFactory.xContent(mapping.bytes()).createParser(mapping.bytes());
return new MappingMetaData("type", parser.mapOrdered());
}
public static XContentBuilder getTextFieldRequestSourceWithSignificnatTerms() throws IOException {
XContentBuilder source = jsonBuilder();
XContentBuilder request = jsonBuilder();
request.startObject()
.startObject("aggregations")
.startObject("classes")
.startObject("terms")
.field("field", "label")
.endObject()
.startObject("aggregations")
.startObject("tokens")
.startObject("significant_terms")
.field("field", "text")
.field("min_doc_count", 0)
.field("shard_min_doc_count", 0)
.endObject()
.endObject()
.endObject()
.endObject()
.endObject()
.endObject();
source.startObject()
.startArray("features")
.startObject()
.field("type", "string")
.field("field", "text")
.field("tokens", "significant_terms")
.field("request", request.string())
.field("index", "index")
.field("number", "tf")
.endObject()
.endArray()
.field("sparse", false)
.endObject();
return source;
}
public static XContentBuilder getTextFieldRequestSourceWithAllTerms() throws IOException {
XContentBuilder source = jsonBuilder();
source.startObject()
.startArray("features")
.startObject()
.field("field", "text")
.field("tokens", "all_terms")
.field("index", "index")
.field("min_doc_freq", 2)
.field("number", "tf")
.field("type", "string")
.endObject()
.endArray()
.field("sparse", false)
.endObject();
return source;
}
protected static XContentBuilder getTextFieldRequestSourceWithGivenTerms() throws IOException {
XContentBuilder source = jsonBuilder();
source.startObject()
.startArray("features")
.startObject()
.field("field", "text")
.field("tokens", "given")
.field("terms", new String[]{"a", "b", "c"})
.field("number", "tf")
.field("type", "string")
.endObject()
.endArray()
.field("sparse", false)
.endObject();
return source;
}
}